package com.qiangesoft.mqtt.config;

import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
import org.springframework.stereotype.Component;

/**
 * mqtt配置
 *
 * @author qiangesoft
 * @date 2024-04-24
 */
@Data
@Component
@Configuration
@ConfigurationProperties(prefix = "mqtt")
public class MqttProperty {

    /**
     * 服务地址
     */
    private String url;

    /**
     * 账号
     */
    private String username;

    /**
     * 密码
     */
    private String password;

    /**
     * 间隔时间
     */
    private int keepAliveInterval;

    /**
     * 超时时间
     */
    private int completionTimeout;

    /**
     * 会话保持，默认为false
     */
    private boolean cleanSession;

    /**
     * 自动连接，默认为true
     */
    private boolean automaticReconnect = true;

    /**
     * 生产者
     */
    private Client producer = new Client();

    /**
     * 消费者
     */
    private Client subscriber = new Client();

    @Data
    public class Client {
        /**
         * 客户端id
         */
        private String clientId;

        /**
         * 默认主题
         */
        private String topic;

        /**
         * 传输质量
         * QoS 0：最多分发一次
         * QoS 1：至少分发一次（默认）
         * QoS 2：只分发一次
         */
        private int qos = 1;
    }

    @Bean
    public MqttPahoClientFactory mqttPahoClientFactory() {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        // 连接参数
        MqttConnectOptions options = new MqttConnectOptions();
        options.setServerURIs(new String[]{url});
        if (StringUtils.isNotBlank(this.username)) {
            options.setUserName(this.username);
        }
        if (StringUtils.isNotBlank(this.password)) {
            options.setPassword(this.password.toCharArray());
        }
        // 心跳时间
        options.setKeepAliveInterval(this.keepAliveInterval);
        // 断开是否自动重联
        options.setAutomaticReconnect(this.automaticReconnect);
        // 保持session，客户端上线后会接受到它离线的这段时间的消息
        options.setCleanSession(this.cleanSession);
        // 设置“遗嘱”消息的话题，若客户端与服务器之间的连接意外中断，服务器将发布客户端的“遗嘱”消息。
//        options.setWill("willTopic", WILL_DATA, 2, false);
        factory.setConnectionOptions(options);
        return factory;
    }
}